package com.example.extendsview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.Nullable;

/**
 * author：sunweihao
 * 创建时间：2021/1/9 19:12
 * Describe：
 */
public class MyButton extends View implements View.OnClickListener {
    private static final String TAG = "MyButton";
    private Bitmap mBitmapBg;
    private Bitmap mBitmapSlide;
    private Paint mPaint;
    private float mSlidLeftMax;
    private float downX;

    /**
     * new的时候执行
     * @param context
     */
    public MyButton(Context context) {
        this(context, null);//改为this后，这里会执行下面的构造方法
    }
    /**
     * xml布局的时候使用
     *
     * @param context
     * @param attrs
     */
    public MyButton(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);//改为this后，这里会执行下面的构造方法
    }

    /**
     * R.attr.buttonStyle的时候执行
     * @param context
     * @param attrs
     * @param defStyleAttr
     */
    public MyButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        Log.d(TAG, "MyButton: 3");
        initView();
        initListener();
    }

    private void initView() {
        mBitmapBg = BitmapFactory.decodeResource(getResources(), R.drawable.bg_bitmap);
        mBitmapSlide = BitmapFactory.decodeResource(getResources(), R.drawable.sliding_bitmap);

        //设置按钮距离左边的最大距离
        mSlidLeftMax = mBitmapBg.getWidth() - mBitmapSlide.getWidth();
        mPaint = new Paint();
        mPaint.setAntiAlias(true);

    }

    /**
     * 测量我们这个控件的大小，并设置为控件大小
     *
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//        设置view的宽高
        setMeasuredDimension(mBitmapBg.getWidth(), mBitmapBg.getHeight());
    }

    /**
     * 绘制图形
     *
     * @param canvas
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        /**
         * @param bitmap
         * @param left 表示从左边哪个位置开始画（相对于自身控件，而不是整个手机）
         * @param top  表示从顶边哪个位置开始画（相对于自身控件，而不是整个手机）
         * @param paint
         */
        canvas.drawBitmap(mBitmapBg, 0, 0, mPaint);
        canvas.drawBitmap(mBitmapSlide, slideLeft, 4, mPaint);
    }

    /**
     * 2.设置监听
     */
    private void initListener() {
        /**
         * 设置点击监听
         */
        setOnClickListener(this);
    }

    //是否开关，默认为false，表示关
    boolean isOpen = false;
    //设置slideBitmap距离背景左边的大小,默认为0
    float slideLeft = 0;

    @Override
    public void onClick(View v) {
        Log.d(TAG, "onClick: ");
        if (isEnableClick){
            //如果是开的
            if (isOpen) {
                close();
            }
            //如果是关的
            else {
                open();
            }
            invalidate();//强制让draw方法再执行
        }
        
    }

    private void open() {
        isOpen = true;
        slideLeft = mSlidLeftMax;
    }

    private void close() {
        isOpen = false;
        slideLeft = 0;
    }
    //这是一个是否允许执行点击事件，默认true,允许
    boolean isEnableClick=true;


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d(TAG, "onTouchEvent: ");

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN://手指按下
                isEnableClick=true;
                //记录下第一次点击时的位置
                downX = event.getX();
                break;
            case MotionEvent.ACTION_MOVE://手移动，有多个移动
                //获取move的位置
                float moveX = event.getX();
                //移动多少：现在的位置-down时的位置
                //屏蔽非法的移动
                float translateX = moveX - downX;

                slideLeft+=translateX;
                block_illegal_movement();

                //刷新draw
                invalidate();
                break;
            case MotionEvent.ACTION_UP://手抬起
                float upX = event.getX();
                float upDownX = upX - downX;
                //获取绝对值
                if (Tool.getAbsoluteValue(upDownX)>5){
                    isEnableClick=false;
                }

                if (slideLeft>mSlidLeftMax/2) {
                    slideLeft=mSlidLeftMax;
                    isOpen=true;
                }else {
                    slideLeft=0;
                    isOpen=false;
                }
                //重新draw
                invalidate();
                break;
        }
        return super.onTouchEvent(event);//true表示事件被消费了，就不会向下传递啦
    }


    private void block_illegal_movement() {
        if (slideLeft>mSlidLeftMax){
            slideLeft=mSlidLeftMax;
        }else if(slideLeft<0){
            slideLeft=0;
        }
    }
}
